/* 将使用 never 类型来表示不应该存在的状态(很抽象是不是) */
// 返回never的函数必须存在无法达到的终点

// 因为必定抛出异常，所以 error 将不会有返回值
function error(message: string): never {
  throw new Error(message)
}

// 因为存在死循环，所以 loop 将不会有返回值
function loop(): never {
  while (true) {}
}

//void类型只是没有返回值 但本身不会出错
function Void(): void {
  console.log()
}

//只会抛出异常没有返回值
function Never(): never {
  throw new Error('aaa')
}
//只有void和number    never在联合类型中会被直接移除
type AAA = void | number | never

/* 
如果回归面不够广，很难发现此类BUG。
由于任何类型都不能赋值给 never 类型的变量，
所以当存在进入 default 分支的可能性时，TS的类型检查会及时帮我们发现这个问题
*/
type A4 = '小满' | '大满' | '超大满'
function isXiaoMan(value: A4) {
  switch (value) {
    case '小满':
      break
    case '大满':
      break
    case '超大满':
      break
    default:
      //是用于场景兜底逻辑
      const error: never = value
      return error
  }
}

/* type AA3 = '小满' | '大满' | '超大满' | '小小满'
function isXiaoMan1(value: AA3) {
  switch (value) {
    case '小满':
      break
    case '大满':
      break
    case '超大满':
      break
    default:
      //是用于场景兜底逻辑--报错
      const error: never = value 
      return error
  }
} */
